﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Configuration;
using System.Web.Mvc;
using ZBJF.Warranty.Common.Common;
using ZBJF.Warranty.Common.Enums;

namespace ZBJF.Warranty.WebProvider.Filter
{
    public class LoginFilterAttribute : ActionFilterAttribute
    {
        //表示是否检查登录
        public bool IsCheck { get; set; }
        public ApplicationType ApplicationType { get; set; }
        //Action方法执行之前执行此方法
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            if (IsCheck)
            {
                CookiesHelper.Instance.SetLoginUserTypeSession((int) ApplicationType);
                //校验用户是否已经登录
                if (WebContext.Instance.CurrentUser == null)
                {
                    //跳转到登陆页
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        filterContext.Result = new JsonResult
                        {
                            Data = new
                            {
                                IsLogin = false,
                                Message = "登录已失效，请重新登录"
                            }
                        };
                    }
                    else
                    {
                        filterContext.HttpContext.Response.Clear();//这里是关键，清除在返回前已经设置好的标头信息，这样后面的跳转才不会报错
                        filterContext.HttpContext.Response.BufferOutput = true;//设置输出缓冲
                        //服务器无法在发送 HTTP 标头时会对这些信息加密；此时修改cookie或输出缓存时将会出错；注：未知错误！
                        //所以只要不同时跳转和修改cookie、输出缓存，就能解决问题；当然，也可以在webconfig配置中修改cacheRolesInCookie属性值设置成false就行了。 
                        if (!filterContext.HttpContext.Response.IsRequestBeingRedirected)
                            filterContext.HttpContext.Response.Redirect(CommonMethod.GetRedirectUrl(RedirectType.Redirect,
                                     "您还没有登录或登录已失效，请您先登录（页面即将跳转至登录页面）！", "/Login"), true);
                    }
                }
            }
        }

        //在controller action result（已经执行完方法，执行result之前）执行之前调用 设置时间戳，用以判断浏览器页面是否是后退、前进
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.Controller.TempData["timestamp"] = CommonMethod.GetTimeStamp(1970);
            base.OnResultExecuting(filterContext);
        }
    }
}
